package github.ziwukun.jsonql.analysis;

import github.ziwukun.jsonql.lang.JSONQL;
import github.ziwukun.jsonql.lang.Select;
import github.ziwukun.jsonql.lang.SelectItem;
import github.ziwukun.jsonql.orm.Model;
import github.ziwukun.jsonql.utils.ModelUtils;

public class ModelAndSelectAnalysistor implements ModelAndQLAnalysistor{
	
	@Override
	public void analysis(Model model, JSONQL ql) throws AnalysisException {
		Select checkSelect = ql.select();
		Select completedSelect = ModelUtils.getModelCompletedSelect(model);
		analysis(completedSelect,checkSelect);
	}
	// 挨个检查checkSelect的一级字段没有超出completedSelect的范围
	// 如果checkSelect的字段有子字段就递归继续检查
	private void analysis(Select completedSelect,Select checkSelect) {
		for (SelectItem selectItem : checkSelect.listItems()) {
			Select propSelect = completedSelect.propSelect(selectItem.prop());
			if(propSelect == null) {
				throw new AnalysisException("非法@select语句{}",selectItem.toJSONQL());
			}
			
			// 检查搜索项没有下级，不需要向下检查
			if(selectItem.isChildEmpty()) {
				continue;
			}
			
			// 检查搜索项有下级搜索项，但是完整搜索项没有下级
			if(!selectItem.isChildEmpty() && propSelect.isItemsEmpty()) {
				throw new AnalysisException("非法@select语句{}",selectItem.toJSONQL());
			}
			
			// 递归向下检查属性的搜索项
			analysis(propSelect, selectItem.childs());
		}
	}
}
